package work.thread_eg.concurrent.subject;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 *
 * 面试题
 * 实现一个容器两个方法 add size
 * 写两个线程 线程一添加10个元素到容器中 线程2实现元素个数的监控 到5的时候 给出提示并且结束
 *
 * volatile尽量修饰基本数据类型
 * 如果修饰引用数据类型 如果引用指向的对象发生了改变 volatile不一定能检测到 所以volatile尽量不修饰引用数据类型
 *
 */
public class Volatile_T1 {


    // ArrayList不是线程安全的
    // 添加volatile 实现线程可见性
//    volatile List list = new ArrayList();

    // 同步容器
    // 1 线程可见性 2 add和size是同步方法 否则size可能得到的不是最新的add之后的值
    volatile List list = Collections.synchronizedList(new LinkedList<>());

    // add 和size两个方法
    public void add(Object o) {
        list.add(o);
    }

    public int size() {
        return list.size();
    }

    public static void main(String[] args) {
        Volatile_T1 c = new Volatile_T1();

        new Thread(()->{
            for(int i=0; i<10 ; i++) {
                c.add(i);
                System.out.println("add  " +i);
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"t1").start();

        new Thread(()->{
            while(true) {
                // size == 5 永远检测不到 解决方法
                if(c.size() == 5) {
                    break;
                }
            }
            System.out.println("t2 结束");
        },"t2").start();


    }
}
